// nodejs模块——fs：对于系统文件及目录进行读写
const fs = require('fs')
// nodejs模块——chalk：修改控制台中字符串样式
const chalk = require('chalk')

/**
 * targets: 返回目标模块列表，如:['compiler-core','compiler-dom']
 * fs.readdirSync(path,options) : 用于同步读取给定目录的内容。返回一个数组，包含目录中所有文件名或对象
 */

const targets = (exports.targets = fs.readdirSync('packages').filter(f => {
  /**
   *  同步判断：过滤掉非文件夹的数据
   * isDirectory ()可以检查一个对象是否是文件夹。 结果返回true则为文件夹
   */
  if (!fs.statSync(`packages/${f}`).isDirectory()) {
    return false
  }
  const pkg = require(`../packages/${f}/package.json`)
  /**
   * 过滤掉 package.json 中 private：true 的私有库 以及 buildOptions为空的属性
   */
  if (pkg.private && !pkg.buildOptions) {
    return false
  }
  return true
}))

/**
 * fuzzyMatchTarget函数：用于匹配模块/包名，可模糊匹配
 * partialTargets：命令行中输入的模块名列表（数组）
 * includeAllMatching：为true时，将返回targets中所有匹配结果，否则只返回第一个
 */
exports.fuzzyMatchTarget = (partialTargets, includeAllMatching) => {
  const matched = []
  partialTargets.forEach(partialTarget => {
    for (const target of targets) {
      // 'compiler-core'.match('core')返回非null
      if (target.match(partialTarget)) {
        matched.push(target)
        if (!includeAllMatching) {
          break
        }
      }
    }
  })
  if (matched.length) {
    return matched
  } else {
    console.log()
    // 匹配结果为空时，抛出error提示命令行中输入的模块名称（partialTargets）找不到
    console.error(
      `${chalk.bgRed.white(' ERROR ')} 
       ${chalk.red(`Target ${chalk.underline(partialTargets)} not found!`)}`
    )
    console.log()
    // 0： 无任何类型的故障结束进程； 1： 某种故障导致结束
    process.exit(1)
  }
}
